import 'dart:async';
import 'package:appsflyer_sdk/appsflyer_sdk.dart';

/// DMA（数字市场法案）合规性管理工具
/// 核心：通过外部传入的国家代码判断DMA适用性，设置对应同意数据
class DmaComplianceManager {
  // 单例模式：确保全局唯一实例
  static final DmaComplianceManager _instance =
      DmaComplianceManager._internal();
  factory DmaComplianceManager() => _instance;
  DmaComplianceManager._internal();

  // -------------------------- 核心配置 --------------------------
  // DMA适用地区列表（欧盟27国 + 欧洲经济区EEA国家，ISO 3166-1 alpha-2 国家代码）
  final List<String> _dmaApplicableRegions = [
    // 欧盟27国
    "AT", "BE", "BG", "CY", "CZ", "DE", "DK", "EE", "ES", "FI",
    "FR", "GR", "HR", "HU", "IE", "IT", "LT", "LU", "LV", "MT",
    "NL", "PL", "PT", "RO", "SE", "SI", "SK",
    // 欧洲经济区（EEA）补充国家
    "IS", "LI", "NO",
  ];

  // -------------------------- 状态管理 --------------------------
  bool _isUserSubjectToDma = false; // 用户是否受DMA约束
  bool _hasSetDmaConsent = false; // 是否已完成DMA同意数据设置
  String? _currentCountryCode; // 外部传入的当前用户国家代码（缓存用）

  // -------------------------- 核心方法 --------------------------
  /// 1. 判断用户是否受DMA约束（需外部传入国家代码）
  /// [countryCode]：外部提供的用户国家代码（需大写，如"DE"代表德国）
  /// 返回值：true=受DMA约束，false=不受约束
  bool checkDmaApplicability(String countryCode) {
    // 校验国家代码格式（非空且为2位大写字母，避免无效值）
    if (countryCode.isEmpty || countryCode.length != 2) {
      print("DMA判断：传入的国家代码格式无效（需2位大写字母），默认按「不受DMA约束」处理");
      _isUserSubjectToDma = false;
      _currentCountryCode = null;
      return false;
    }

    final String upperCountryCode = countryCode.toUpperCase();
    _currentCountryCode = upperCountryCode;
    // 匹配DMA适用地区列表
    _isUserSubjectToDma = _dmaApplicableRegions.contains(upperCountryCode);

    // print(
    //   "DMA判断结果：国家代码=$upperCountryCode，${_isUserSubjectToDma ? '受DMA约束' : '不受DMA约束'}",
    // );
    return _isUserSubjectToDma;
  }

  /// 2. 设置DMA合规同意数据（需在AppsFlyer SDK启动前调用）
  /// [appsflyerSdk]：已初始化的AppsFlyer SDK实例
  /// [allowCrossAppTracking]：用户是否同意跨应用跟踪（DMA核心权限1）
  /// [allowPersonalizedAds]：用户是否同意个性化广告（DMA核心权限2）
  Future<void> setDmaConsentData({
    required AppsflyerSdk appsflyerSdk,
    required bool allowCrossAppTracking,
    required bool allowPersonalizedAds,
  }) async {
    // 前置校验：1.用户需受DMA约束 2.国家代码已传入 3.未重复设置
    if (!_isUserSubjectToDma) {
      print("DMA同意设置：用户不受DMA约束，无需执行此操作");
      return;
    }
    if (_currentCountryCode == null) {
      print("DMA同意设置：未先调用checkDmaApplicability传入国家代码，无法执行");
      return;
    }
    if (_hasSetDmaConsent) {
      print("DMA同意设置：已完成设置，无需重复调用");
      return;
    }

    // 通过AppsFlyer最新的setConsentDataV2 API传递DMA同意数据
    // 映射关系：
    // - allowCrossAppTracking → consentForDataUsage（数据使用权限）
    // - allowPersonalizedAds → consentForAdsPersonalization（个性化广告权限）
    // - hasConsentForAdStorage：与跨应用跟踪权限关联（DMA要求统一）
    appsflyerSdk.setConsentDataV2(
      isUserSubjectToGDPR: true, // DMA与GDPR适用区域高度重合，默认标记为GDPR用户
      consentForDataUsage: allowCrossAppTracking,
      consentForAdsPersonalization: allowPersonalizedAds,
      hasConsentForAdStorage: allowCrossAppTracking,
    );

    _hasSetDmaConsent = true;
    // print(
    //   "DMA同意数据设置成功：跨应用跟踪=$allowCrossAppTracking，个性化广告=$allowPersonalizedAds",
    // );
  }

  // -------------------------- 状态查询与重置 --------------------------
  /// 获取当前DMA合规状态（供外部查询）
  Map<String, dynamic> getDmaComplianceStatus() {
    return {
      "currentCountryCode": _currentCountryCode,
      "isUserSubjectToDma": _isUserSubjectToDma,
      "hasSetDmaConsent": _hasSetDmaConsent,
    };
  }

  /// 重置DMA状态（用于用户重新授权、切换地区等场景）
  void resetDmaStatus() {
    _isUserSubjectToDma = false;
    _hasSetDmaConsent = false;
    _currentCountryCode = null;
    print("DMA状态已重置：清除国家代码缓存及同意状态");
  }
}

// -------------------------- 使用示例 --------------------------
/*
// 1. 外部获取用户国家代码（示例：从后端接口、设备定位等渠道获取）
String userCountryCode = "DE"; // 假设外部获取到用户国家代码为"DE"（德国）

// 2. 初始化DMA管理器与AppsFlyer SDK
final dmaManager = DmaComplianceManager();


// 3. 判断用户是否受DMA约束
bool isDmaUser = dmaManager.checkDmaApplicability(userCountryCode);

// 4. 若受DMA约束，获取用户同意后设置数据
if (isDmaUser) {
  // 示例：通过弹窗获取用户同意（实际需替换为你的同意弹窗逻辑）
  bool userAllowTracking = await showDmaConsentDialog(); // 自定义弹窗
  bool userAllowAds = userAllowTracking; // 实际场景可分开询问

  // 设置DMA同意数据
  await dmaManager.setDmaConsentData(
    appsflyerSdk: appsflyerSdk,
    allowCrossAppTracking: userAllowTracking,
    allowPersonalizedAds: userAllowAds
  );
}

// 5. 启动AppsFlyer SDK（需在同意数据设置后）
appsflyerSdk.startSDK(
  onSuccess: () => print("AppsFlyer SDK启动成功"),
  onError: (code, msg) => print("AppsFlyer SDK启动失败：$code - $msg")
);
*/
